package generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Property;
import com.ssm.basis.model.pojo.domain.BaseDo;

import java.util.Collections;
import java.util.Scanner;

/**
 * 代码生成器
 * <a href="https://github.com/baomidou/generator">generator</a>
 * <a href="https://mybatis-plus.com/guide/generator-new.html">generator-new</a>
 * <a href="https://mybatis-plus.com/config/generator-config.html">generator-config</a>
 * <a href="https://gitee.com/baomidou/mybatis-plus-samples">mybatis-plus-samples</a>
 */
public class MybatisPlusCodeGenerator {
    // =============================================================================================================
    static final String URL = "jdbc:mysql://10.74.2.71:3306/ssm?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
    static final String USERNAME = "root";
    static final String PASSWORD = "root";
    // =============================================================================================================
    static final String USER_DIR = System.getProperty("user.dir") + "/ssm-platform";
    // =============================================================================================================
    static final String AUTHOR = "jhxxb";

    public static void main(String[] args) {
        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(URL, USERNAME, PASSWORD).build();

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator(dataSourceConfig);

        // 全局配置
        GlobalConfig gc = new GlobalConfig.Builder()
            .outputDir(USER_DIR + "/src/main/java")
            .author(AUTHOR) // 开发人员
            .disableOpenDir()
            .enableSwagger() // 实体属性 Swagger 注解
            .build();
        mpg.global(gc);

        // 包配置
        PackageConfig pc = new PackageConfig.Builder()
            .parent("com.ssm.platform")
            .entity("pojo.domain") // 实体类包名
            .pathInfo(Collections.singletonMap(OutputFile.xml, USER_DIR + "/src/main/resources/mapper/")) // 设置 xml 生成路径
            .build();
        mpg.packageInfo(pc);

        TemplateConfig templateConfig = new TemplateConfig.Builder()
            .disable(TemplateType.CONTROLLER, TemplateType.SERVICE, TemplateType.SERVICE_IMPL) // 不生成
            .build();
        mpg.template(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig.Builder()
            .addTablePrefix("t_", "mp_") // 要生成表的前缀，生成时会去掉前缀
            .addInclude(scanner("表名，多个英文逗号分割").split(",")) // 需要生成的表，不设置默认生成所有
            .entityBuilder() // 实体策略配置
            .enableFileOverride() // 是否覆盖文件
            .superClass(BaseDo.class) // 实体类的父类，没有就不用设置
            .addSuperEntityColumns("create_time", "create_user", "update_time", "update_user", "is_deleted") // 写于父类中的公共字段
            .enableLombok() // 是否为 lombok 模型
            .enableChainModel()
            .enableActiveRecord() // 实体开启 ActiveRecord 模式
            .addTableFills(new Property("openid", FieldFill.INSERT))  // 表的自动填充字段
            .formatFileName("%sDo") // 自定义文件命名， %s 为占位符
            .controllerBuilder() // controller 策略配置
            .enableRestStyle() // 生成 @RestController 控制器
            .mapperBuilder() // Mapper 策略配置
            // .enableBaseResultMap() // XML ResultMap
            .enableBaseColumnList() // XML columList
            .build();
        mpg.strategy(strategy);

        mpg.execute(new FreemarkerTemplateEngine()); // 切换为 freemarker 模板引擎执行，默认 velocity 模板引擎
    }

    /**
     * 读取控制台内容
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入" + tip + "：");
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }
}